package tests;


import static org.junit.Assert.assertTrue;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.concurrent.CopyOnWriteArrayList;

import org.junit.Before;
import org.junit.Test;

import ubicacionEnAvion.Centro;
import ubicacionEnAvion.Pasillo;
import ubicacionEnAvion.Ventana;
import usuario.TipoUsuarioGratuito;
import usuario.TipoUsuarioVip;
import vuelo.Vuelo;
import vuelo.VueloConEscala;
import vuelo.VueloDirecto;
import asiento.Asiento;
import asiento.Disponible;
import asiento.Reservado;
import busqueda.Busqueda;
import claseAsiento.ClaseAsiento;
import claseAsiento.Ejecutiva;
import claseAsiento.PrimeraClase;
import claseAsiento.Turista;
import filtro.Filtro;
import filtro.FiltroPorClaseAsiento;
import filtro.FiltroPorDisponibilidad;
import filtro.FiltroPorPrecioMinYMax;
import filtro.FiltroPorSuperOfertas;
import filtro.FiltroPorUbicacionEnAvion;

public class FiltroIntegradorTest {

	FiltroPorUbicacionEnAvion filtroUbicacion;
	FiltroPorClaseAsiento filtroClase;
	FiltroPorDisponibilidad filtroDisponibilidad;
	FiltroPorPrecioMinYMax filtroPrecio;
	FiltroPorSuperOfertas filtroSuperOfertas;
	
	Collection<Vuelo> vuelos;
	Collection<VueloDirecto> vuelosDirectos;
	VueloDirecto vueloDirecto, vueloDeEscala;
	VueloConEscala vueloConEscala;
	Busqueda busqueda1, busqueda2, busqueda3, busqueda4, busqueda5;
	Asiento asiento1, asiento2, asiento3, asiento4, asiento5, asiento6, asiento7, asiento8, asiento9;
	Collection<Filtro> todosLosFiltros;
	Collection<Asiento> asientos;
	
	@Before
	public void setUp() throws Exception {
		
		filtroUbicacion = new FiltroPorUbicacionEnAvion();
		filtroClase = new FiltroPorClaseAsiento();
		filtroDisponibilidad = new FiltroPorDisponibilidad();
		filtroPrecio = new FiltroPorPrecioMinYMax();
		filtroSuperOfertas = new FiltroPorSuperOfertas();
		
		todosLosFiltros = new CopyOnWriteArrayList<Filtro>();
		todosLosFiltros.add(filtroUbicacion);
		todosLosFiltros.add(filtroClase);
		todosLosFiltros.add(filtroDisponibilidad);
		todosLosFiltros.add(filtroPrecio);
		todosLosFiltros.add(filtroSuperOfertas);
		
		asiento1 = new Asiento();
		asiento1.setUbicacionEnAvion(new Ventana());
		asiento1.setClaseAsiento(new Turista());
		asiento1.setEstado(new Reservado());
		asiento1.setPrecio(new BigDecimal("3000"));
		asiento1.setFechaLlegada(new Date());
		asiento1.setFechaSalida(new Date());
		
		asiento2 = new Asiento();
		asiento2.setUbicacionEnAvion(new Centro());
		asiento2.setClaseAsiento(new Turista());
		asiento2.setEstado(new Disponible());
		asiento2.setPrecio(new BigDecimal("5000"));
		
		asiento3 = new Asiento();
		asiento3.setUbicacionEnAvion(new Pasillo());
		asiento3.setClaseAsiento(new Turista());
		asiento3.setEstado(new Reservado());
		asiento3.setPrecio(new BigDecimal("9000"));
		
		asiento4 = new Asiento();
		asiento4.setUbicacionEnAvion(new Ventana());
		asiento4.setClaseAsiento(new Ejecutiva());
		asiento4.setEstado(new Disponible());
		asiento4.setPrecio(new BigDecimal("3000"));
		
		asiento5 = new Asiento();
		asiento5.setUbicacionEnAvion(new Centro());
		asiento5.setClaseAsiento(new Ejecutiva());
		asiento5.setEstado(new Reservado());
		asiento5.setPrecio(new BigDecimal("5000"));
		
		asiento6 = new Asiento();
		asiento6.setUbicacionEnAvion(new Pasillo());
		asiento6.setClaseAsiento(new Ejecutiva());
		asiento6.setEstado(new Disponible());
		asiento6.setPrecio(new BigDecimal("9000"));
		
		asiento7 = new Asiento();
		asiento7.setUbicacionEnAvion(new Ventana());
		asiento7.setClaseAsiento(new PrimeraClase());
		asiento7.setEstado(new Reservado());
		asiento7.setPrecio(new BigDecimal("3000"));
		
		asiento8 = new Asiento();
		asiento8.setUbicacionEnAvion(new Centro());
		asiento8.setClaseAsiento(new PrimeraClase());
		asiento8.setEstado(new Disponible());
		asiento8.setPrecio(new BigDecimal("5000"));
		
		asiento9 = new Asiento();
		asiento9.setUbicacionEnAvion(new Pasillo());
		asiento9.setClaseAsiento(new PrimeraClase());
		asiento9.setEstado(new Reservado());
		asiento9.setPrecio(new BigDecimal("9000"));
		
		
		asientos = new CopyOnWriteArrayList<Asiento>();
		
		asientos.add(asiento1);
		asientos.add(asiento2);
		asientos.add(asiento3);
		asientos.add(asiento4);
		asientos.add(asiento5);
		asientos.add(asiento6);
		asientos.add(asiento7);
		asientos.add(asiento8);
		asientos.add(asiento9);
		
		vueloDirecto = new VueloDirecto("ECO344", asiento1);
		vueloDirecto.setAsientos(asientos);
		
		vueloDeEscala = new VueloDirecto("ECO344", asiento1);
		
		vuelosDirectos = new CopyOnWriteArrayList<VueloDirecto>();
		vuelosDirectos.add(vueloDeEscala);
		vuelosDirectos.add(vueloDirecto);
		
		vueloConEscala = new VueloConEscala(vuelosDirectos);
		
		vuelos = new CopyOnWriteArrayList<Vuelo>();
		vuelos.add(vueloDirecto);
		vuelos.add(vueloConEscala);
		//La collection de vuelos tiene 1 vuelo Directo y 1 con escala, y como la busqueda es sin escala los filtros ignoran el vueloConEscala
		
		busqueda1 = new Busqueda("Arg", "Bra", "12/10/12");
		ArrayList<ClaseAsiento> clasesAsientoBusqueda = new ArrayList<ClaseAsiento>();
		clasesAsientoBusqueda.add(new PrimeraClase());
		busqueda1.setClaseAsiento(clasesAsientoBusqueda);
		busqueda1.setEstadoDeReserva(new Disponible());
		busqueda1.setPrecioMinimo(new BigDecimal ("2000"));
		busqueda1.setPrecioMaximo(new BigDecimal ("10000"));
		busqueda1.setUbicacionEnAvion(new Ventana());
		busqueda1.setTipoUsuario(new TipoUsuarioGratuito());
		busqueda1.setFiltros(todosLosFiltros);

		busqueda2 = new Busqueda("Arg", "Bra", "12/10/12");
		ArrayList<ClaseAsiento> clasesAsientoBusqueda1 = new ArrayList<ClaseAsiento>();
		clasesAsientoBusqueda1.add(new Turista());
		busqueda2.setClaseAsiento(clasesAsientoBusqueda1);
		busqueda2.setEstadoDeReserva(new Reservado());
		busqueda2.setPrecioMinimo(new BigDecimal ("2000"));
		busqueda2.setPrecioMaximo(new BigDecimal ("10000"));
		busqueda2.setUbicacionEnAvion(new Ventana());
		busqueda2.setTipoUsuario(new TipoUsuarioGratuito());
		busqueda2.setFiltros(todosLosFiltros);
		
		busqueda3 = new Busqueda("Arg", "Bra", "12/10/12");
		ArrayList<ClaseAsiento> clasesAsientoBusqueda2 = new ArrayList<ClaseAsiento>();
		clasesAsientoBusqueda2.add(new Turista());
		clasesAsientoBusqueda2.add(new Ejecutiva());
		busqueda3.setClaseAsiento(clasesAsientoBusqueda2);
		busqueda3.setEstadoDeReserva(new Reservado());
		busqueda3.setPrecioMinimo(new BigDecimal ("2000"));
		busqueda3.setPrecioMaximo(new BigDecimal ("10000"));
		busqueda3.setUbicacionEnAvion(new Pasillo());
		busqueda3.setTipoUsuario(new TipoUsuarioGratuito());
		busqueda3.setFiltros(todosLosFiltros);
		
		busqueda4 = new Busqueda("Arg", "Bra", "12/10/12");
		busqueda3.setTipoUsuario(new TipoUsuarioVip());
	
		busqueda5 = new Busqueda("Arg", "Bra", "12/10/12");
	}

	@Test
	public void filtroIntegrador1(){
		busqueda1.filtrar(vuelos);
		assertTrue(vueloDirecto.getAsientos().size() == 0);
	}

	@Test
	public void filtroIntegrador2(){
		busqueda2.filtrar(vuelos);
		assertTrue(vueloDirecto.getAsientos().size() == 1);
	}
	
	@Test
	public void filtroIntegrador3(){
		busqueda3.filtrar(vuelos);
		assertTrue(vueloDirecto.getAsientos().size() == 2);
	}
	
	@Test
	public void filtroIntegrador4(){
		busqueda4.filtrar(vuelos);
		assertTrue(vueloDirecto.getAsientos().size() == 9);
	}
	
	@Test
	public void filtroIntegrador5(){
		busqueda5.filtrar(vuelos);
		assertTrue(vueloDirecto.getAsientos().size() == 9);
	}
}
